package com.m1.tzolkin.model.board;

import java.util.Collection;

import com.m1.tzolkin.model.buildables.IActionBuilding;
import com.m1.tzolkin.model.buildables.IFarm;
import com.m1.tzolkin.model.buildables.IMonument;
import com.m1.tzolkin.model.buildables.IZonedBuilding;
import com.m1.tzolkin.model.exceptions.CannotBuildException;
import com.m1.tzolkin.model.exceptions.NoAvailableSkullException;
import com.m1.tzolkin.model.exceptions.NotEnoughCornException;
import com.m1.tzolkin.model.exceptions.NotEnoughResourceException;

public interface IBuildBoard extends ITempleBoard {
	
	// REQUETES
	
	/**
	 * Retourne l'ensemble des b�timents constructibles.
	 */
	Collection<IZonedBuilding> getBuildings();
	
	/**
	 * Retourne l'ensemble des monuments constructibles.
	 */
	Collection<IMonument> getMonuments();
	
	/**
	 * Retourne le nombre de b�timents que le joueur courant peut construire.
	 */
	int canBuildBuildings();
	
	/**
	 * Retourne le nombre de monuments que le joueur courant peut construire.
	 */
	int canBuildMonuments();
	
	// COMMANDES
	
	/**
	 * Construit le constructible b.
	 * @pre <pre>
	 *     b != null
	 *     getBuildings().contains(b) || getMonuments().contains(b)
	 *     getCurrentPlayer().getAmount().contains(b.getCost()) </pre>
	 */
	void build(IFarm b) throws NotEnoughCornException, NotEnoughResourceException, NoAvailableSkullException, CannotBuildException;
	void build(IActionBuilding b) throws NotEnoughCornException, NotEnoughResourceException, NoAvailableSkullException, CannotBuildException;
	void build(IMonument b) throws NotEnoughCornException, NotEnoughResourceException, NoAvailableSkullException, CannotBuildException;
	
	/**
	 * Permet de construire i b�timents.
	 * @pre <pre>
	 *     i >= 0 </pre>
	 */
	void setBuildBuildings(int i);
	
	/**
	 * Permet de construire i monuments.
	 * @pre <pre>
	 *     i >= 0 </pre>
	 */
	void setBuildMonuments(int i);

}
